home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / pi-port.c < prev    next >
C/C++ Source or Header  |  1997-06-14  |  5KB  |  215 lines

  1. /* pi-port.c:  Serial server
  2.  *
  3.  * Copyright (c) 1997, Kenneth Albanowski
  4.  *
  5.  * This is free software, licensed under the GNU Public License V2.
  6.  * See the file COPYING for details.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <unistd.h>
  13. #include "pi-source.h"
  14. #include "pi-socket.h"
  15. #include "pi-dlp.h"
  16. #include "pi-serial.h"
  17. #include "pi-slp.h"
  18. #include <signal.h>
  19.  
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <netinet/in.h>
  23. #include <arpa/inet.h>
  24. #include <netdb.h>
  25.  
  26. void sigint(int num)
  27. {
  28.   *((char*)0)=0;
  29. }
  30.  
  31. void do_read(struct pi_socket * ps, int type, char * buffer, int length)
  32. {
  33.   fprintf(stderr, "A %d byte packet of type %d has been received from the network\n", length, type);
  34.   dumpdata(buffer, length);
  35.   if (type == 0 ) {
  36.     struct pi_skb * nskb;
  37.     nskb = (struct pi_skb *)malloc(sizeof(struct pi_skb));
  38.  
  39.     nskb->source = buffer[0];
  40.     nskb->dest = buffer[1];
  41.     nskb->type = buffer[2];
  42.     nskb->id = buffer[3];
  43.     
  44.     memcpy(&nskb->data[10], buffer+4, length-4);
  45.     slp_tx(ps, nskb, length-4);
  46.  
  47.   } else if (type == 1 ) {
  48.  
  49.     ps->rate = get_long(buffer);
  50.     pi_serial_flush(ps);
  51.     ps->serial_changebaud(ps);
  52.   }
  53. }
  54.                   
  55. int main(int argc, char *argv[])
  56. {
  57.   struct pi_sockaddr addr;
  58.   int sd;
  59.   struct pi_socket * ps;
  60.   int ret;
  61.   struct sockaddr_in serv_addr;
  62.   int serverfd, fd;
  63.   char * buffer;
  64.   char * slpbuffer;
  65.   char * device = argv[1];
  66.   int port = 4386;
  67.   
  68.   extern char* optarg;
  69.   extern int optind;
  70.   
  71.   if (argc<2) {
  72.       puts("Usage: pi-port serialdevice");
  73.       exit(0);
  74.   }
  75.  
  76.   signal(SIGINT, sigint);
  77.   
  78.   buffer = malloc(0xFFFF+128);
  79.   slpbuffer = malloc(0xFFFF+128);
  80.   
  81.   if ((serverfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  82.     perror("Unable to obtain socket");
  83.     goto end;
  84.   }
  85.   
  86.   memset((char*)&serv_addr, 0, sizeof(serv_addr));
  87.   serv_addr.sin_family = AF_INET;
  88.   serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  89.   serv_addr.sin_port = htons(port);
  90.   
  91.   if (bind(serverfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))<0) {
  92.     perror("Unable to bind local address");
  93.     goto end;
  94.   }
  95.   
  96.   listen(serverfd, 5);
  97.   
  98.   if (!(sd = pi_socket(PI_AF_SLP, PI_SOCK_RAW, PI_PF_SLP))) {
  99.     perror("pi_socket");
  100.     exit(1);
  101.   }
  102.  
  103.   addr.pi_family = PI_AF_SLP;
  104.   strcpy(addr.pi_device,device);
  105.  
  106.   ret = pi_bind(sd, (struct sockaddr*)&addr, sizeof(addr));
  107.   if(ret == -1) {
  108.     perror("pi_bind");
  109.     exit(1);
  110.   }
  111.   
  112.   ps = find_pi_socket(sd);
  113.   ps->rate = 9600;
  114.   ps->serial_changebaud(ps);
  115.  
  116.   for (;;) {
  117.     int l;
  118.     int max;
  119.     fd_set rset, wset, eset, oset;
  120.     struct sockaddr_in conn_addr;
  121.     int connlen = sizeof(conn_addr);
  122.     int sent;
  123.     
  124.     fd = accept(serverfd, (struct sockaddr*)&conn_addr, &connlen);
  125.     
  126.     if (fd < 0) {
  127.       perror("Server: accept error");
  128.       goto end;
  129.     }
  130.     
  131.     FD_ZERO(&oset);
  132.     FD_SET(fd, &oset);
  133.     FD_SET(sd, &oset);
  134.     
  135.     sent = 0;
  136.     l = 0;
  137.     
  138.     max = fd;
  139.     if (sd>max)
  140.       max = sd;
  141.     max++;
  142.         
  143.     for(;;) {
  144.       rset = wset = eset = oset;
  145.       select(max, &rset, &wset, &eset, 0);
  146.       
  147.       if (FD_ISSET(fd, &rset)) {
  148.         int r = read(fd, buffer+l, 0xFFFF-l);
  149.         
  150.         if (r<0)
  151.           break;
  152.           
  153.         if (r==0)
  154.           goto skip;
  155.           
  156.         fprintf(stderr, "Read %d bytes from network at block+%d:\n", r, l);
  157.         dumpdata(buffer+l, r);
  158.           
  159.         l += r;
  160.         if (l>=4) {
  161.           int blen;
  162.           while(l >= 4 && (l >= (blen = get_short(buffer+2))+4 )) {
  163.             fprintf(stderr, "l = %d, blen = %d\n", l, blen);
  164.             do_read(ps, get_short(buffer),buffer+4,blen);
  165.             l = l-blen-4;
  166.             if (l>blen) {
  167.               memmove(buffer,buffer+4+blen,l);
  168.             }
  169.             fprintf(stderr, "Buffer now is:\n");
  170.             dumpdata(buffer, l);
  171.           }
  172.         }
  173.         skip:
  174.         ;
  175.       }
  176.       if (FD_ISSET(sd, &rset)) {
  177.         ps->serial_read(ps, 1);
  178.         if (ps->rxq) {
  179.           fprintf(stderr, "A %d byte packet has been received from the serial port\n", ps->rxq->len);
  180.         }
  181.       }
  182.       if (FD_ISSET(fd, &wset) && ps->rxq) {
  183.         int w = write(fd, ps->rxq->data+sent, ps->rxq->len-sent);
  184.         
  185.         if (w<0)
  186.           break;
  187.         
  188.         sent += w;
  189.         if (w >= ps->rxq->len) {
  190.           struct pi_skb * skb = ps->rxq;
  191.           ps->rxq = ps->rxq->next;
  192.  
  193.           fprintf(stderr, "A %d byte packet has been sent over the network\n", skb->len); 
  194.           free(skb);
  195.           sent = 0;
  196.         }
  197.         
  198.       }
  199.       if (FD_ISSET(sd, &wset) && ps->txq) {
  200.         fprintf(stderr, "A %d byte packet is being sent to the serial port\n", ps->txq->len);
  201.         ps->serial_write(ps);
  202.       }
  203.       if (FD_ISSET(fd, &eset)) {
  204.           break;
  205.       }
  206.       if (FD_ISSET(sd, &eset)) {
  207.           break;
  208.       }
  209.     }
  210.   }
  211. end:  
  212.   exit(0);
  213. }
  214.  
  215.